package cashpointer.mobile.dao;

import android.content.ContentUris;
import android.content.ContentValues;
import android.content.Context;
import android.database.Cursor;
import android.net.Uri;
import cashpointer.mobile.dao.DaoModel.Cashpoints;
import cashpointer.mobile.dao.DaoModel.Countries;
import cashpointer.mobile.dao.DaoModel.Owners;
import cashpointer.mobile.dao.DaoModel.Regions;
import cashpointer.mobile.support.PreferencesManager;

public class DAOFunctions {
	/**
	 * Funkcja zwraca identyfikator danego wlasciciela, jesli taki nie istnieje
	 * tworzy nowy rekord i zwraca jego id.
	 * @param ownerName
	 * @return
	 */
	public static int getOwner(Context context, String ownerName) {
		if (ownerName == null || context == null) {
			return 0;
		}
		
		// Wyszukuje identyfikator ownera.
        int idOfOwner = 0;
        
        // Jakie kolumny maja byc zwrocone
    	String[] projection = new String[] {
        	Owners._ID // 0
        };
    	    	
    	// Warunek selekcji
    	String where =  Owners.NAME + " = ?";
    	
    	// Argumenty do warunku selekcji
    	String[] whereArg = new String[] {
    		ownerName
    	};

		Cursor cursor = context.getContentResolver().query(Owners.CONTENT_URI, projection, where, whereArg, Owners.DEFAULT_SORT_ORDER);
		
    	// Pobieram pierwsza wyszukana wartosc
		if (cursor.moveToFirst()) {
	        int idColumn = cursor.getColumnIndex(Owners._ID);
	        idOfOwner = cursor.getInt(idColumn);
		} else {
			idOfOwner = 0;
		}
        
        // Jesli zero to znaczy ze jeszcze nie ma takiego wpisu w bazie danych
        if (idOfOwner == 0) {
        	// Dane nowego ownera
        	ContentValues values = new ContentValues();
            values.put(Owners.NAME, ownerName);
            values.put(Owners.SELECTED, true);
            
            // Dodaje nowy rekord
    		Uri uri = context.getContentResolver().insert(Owners.CONTENT_URI, values);
        	if (uri != null) {
        		String newId = uri.getLastPathSegment();
        		if (newId != null) {
        			try {
        				idOfOwner = Integer.parseInt(newId);
        			} catch (Exception e) {
        				// polykam wyjatek
        			}
        		}
        	}
        }
        
        // Zamykam kursor
        if (cursor != null) {
        	cursor.close();
        }
		
		// Zwracam identfikator ownera
		return idOfOwner;
	}

	/**
	 * Funkcja zwraca identyfikator danego wojewodztwa, jesli taki nie istnieje
	 * tworzy nowy rekord i zwraca jego id.
	 * @param ragionName
	 * @return
	 */
	public static int getRegionReadOlny(Context context, String ragionName) {
		if (ragionName == null || context == null) {
			return 0;
		}
		
		// Wyszukuje identyfikator wojewodztwa.
        int idOfRegion = 0;
        
        // Jakie kolumny maja byc zwrocone
    	String[] projection = new String[] {
        	Regions._ID // 0
        };
    	    	
    	// Warunek selekcji
    	String where =  Regions.NAME + " = ?";
    	
    	// Argumenty do warunku selekcji
    	String[] whereArg = new String[] {
    		ragionName
    	};

		Cursor cursor = context.getContentResolver().query(Regions.CONTENT_URI, projection, where, whereArg, Regions.DEFAULT_SORT_ORDER);
		
    	// Pobieram pierwsza wyszukana wartosc
		if (cursor.moveToFirst()) {
	        int idColumn = cursor.getColumnIndex(Regions._ID);
	        idOfRegion = cursor.getInt(idColumn);
		} else {
			idOfRegion = 0;
		}
        
        // Zamykam kursor
        if (cursor != null) {
        	cursor.close();
        }
        
		// Zwracam identfikator wojewodztwa
		return idOfRegion;
	}
	
	/**
	 * Funkcja zwraca identyfikator danego wojewodztwa, jesli taki nie istnieje
	 * tworzy nowy rekord i zwraca jego id.
	 * @param ragionName
	 * @return
	 */
	public static int getRegion(Context context, String ragionName) {
		if (ragionName == null || context == null) {
			return 0;
		}
		
		// Wyszukuje identyfikator wojewodztwa.
        int idOfRegion = 0;
        
        // Jakie kolumny maja byc zwrocone
    	String[] projection = new String[] {
        	Regions._ID // 0
        };
    	    	
    	// Warunek selekcji
    	String where =  Regions.NAME + " = ?";
    	
    	// Argumenty do warunku selekcji
    	String[] whereArg = new String[] {
    		ragionName
    	};

		Cursor cursor = context.getContentResolver().query(Regions.CONTENT_URI, projection, where, whereArg, Regions.DEFAULT_SORT_ORDER);
		
    	// Pobieram pierwsza wyszukana wartosc
		if (cursor.moveToFirst()) {
	        int idColumn = cursor.getColumnIndex(Regions._ID);
	        idOfRegion = cursor.getInt(idColumn);
		} else {
			idOfRegion = 0;
		}
        
        // Jesli zero to znaczy ze jeszcze nie ma takiego wpisu w bazie danych
        if (idOfRegion == 0) {
        	// Dane nowe wojewodztwo
        	ContentValues values = new ContentValues();
            values.put(Regions.NAME, ragionName);
            
            // Dodaje nowy rekord
    		Uri uri = context.getContentResolver().insert(Regions.CONTENT_URI, values);
        	if (uri != null) {
        		String newId = uri.getLastPathSegment();
        		if (newId != null) {
        			try {
        				idOfRegion = Integer.parseInt(newId);
        				
        		        // Dodaje rekord " wszystkie " do wojewodztwa
        				getCountry(context, PreferencesManager.NONE, idOfRegion);
        			} catch (Exception e) {
        				// polykam wyjatek
        			}
        		}
        	}
        }
        

        // Zamykam kursor
        if (cursor != null) {
        	cursor.close();
        }
        
		// Zwracam identfikator wojewodztwa
		return idOfRegion;
	}
	
	/**
	 * Funkcja zwraca identyfikator danego powiaty, jesli taki nie istnieje
	 * tworzy nowy rekord i zwraca jego id.
	 * @param countryName
	 * @param regionId
	 * @return
	 */
	public static int getCountryReadOnly(Context context, String countryName, int regionId) {
		if (countryName == null || regionId == 0 || context == null) {
			return 0;
		}
		
		// Wyszukuje identyfikator powiatu.
        int idOfCountry = 0;
        
        // Jakie kolumny maja byc zwrocone
    	String[] projection = new String[] {
        	Countries._ID // 0
        };
    	    	
    	// Warunek selekcji
    	String where =  Countries.NAME + " = ? AND " + Countries.REGION_ID + " = ?";
    	
    	// Argumenty do warunku selekcji
    	String[] whereArg = new String[] {
    		countryName,
    		String.valueOf(regionId) 
    	};

		Cursor cursor = context.getContentResolver().query(Countries.CONTENT_URI, projection, where, whereArg, Countries.DEFAULT_SORT_ORDER);
		
    	// Pobieram pierwsza wyszukana wartosc
		if (cursor.moveToFirst()) {
	        int idColumn = cursor.getColumnIndex(Countries._ID);
	        idOfCountry = cursor.getInt(idColumn);
		} else {
			idOfCountry = 0;
		}
        
        // Zamykam kursor
        if (cursor != null) {
        	cursor.close();
        }
		
		// Zwracam identfikator powiatu
		return idOfCountry;
	}
	
	/**
	 * Funkcja zwraca identyfikator danego powiaty, jesli taki nie istnieje
	 * tworzy nowy rekord i zwraca jego id.
	 * @param countryName
	 * @param regionId
	 * @return
	 */
	public static int getCountry(Context context, String countryName, int regionId) {
		if (countryName == null || regionId == 0 || context == null) {
			return 0;
		}
		
		// Wyszukuje identyfikator powiatu.
        int idOfCountry = 0;
        
        // Jakie kolumny maja byc zwrocone
    	String[] projection = new String[] {
        	Countries._ID // 0
        };
    	    	
    	// Warunek selekcji
    	String where =  Countries.NAME + " = ? AND " + Countries.REGION_ID + " = ?";
    	
    	// Argumenty do warunku selekcji
    	String[] whereArg = new String[] {
    		countryName,
    		String.valueOf(regionId) 
    	};

		Cursor cursor = context.getContentResolver().query(Countries.CONTENT_URI, projection, where, whereArg, Countries.DEFAULT_SORT_ORDER);
		
    	// Pobieram pierwsza wyszukana wartosc
		if (cursor.moveToFirst()) {
	        int idColumn = cursor.getColumnIndex(Countries._ID);
	        idOfCountry = cursor.getInt(idColumn);
		} else {
			idOfCountry = 0;
		}
        
        // Jesli zero to znaczy ze jeszcze nie ma takiego wpisu w bazie danych
        if (idOfCountry == 0) {
        	// Dane nowy powiat
        	ContentValues values = new ContentValues();
            values.put(Countries.NAME, countryName);
            values.put(Countries.REGION_ID, regionId);
            
            // Dodaje nowy rekord
    		Uri uri = context.getContentResolver().insert(Countries.CONTENT_URI, values);
        	if (uri != null) {
        		String newId = uri.getLastPathSegment();
        		if (newId != null) {
        			try {
        				idOfCountry = Integer.parseInt(newId);
        			} catch (Exception e) {
        				// polykam wyjatek
        			}
        		}
        	}
        }

        // Zamykam kursor
        if (cursor != null) {
        	cursor.close();
        }
		
		// Zwracam identfikator powiatu
		return idOfCountry;
	}

	/**
	 * Funkcja zwraca identyfikator bankomatu jesli ten isntnieje, w przeciwnym wypadku
	 * zwraca wartosc 0
	 * @param hashcode
	 * @return
	 */
	public static int getCashpointId(Context context, String hashcode) {
		if (hashcode == null) {
			return 0;
		}
		
		// Wyszukuje identyfikator bankomatu.
        int idOfCashpoint = 0;
        
        // Jakie kolumny maja byc zwrocone
    	String[] projection = new String[] {
        	Cashpoints._ID // 0
        };
    	    	
    	// Warunek selekcji
    	String where =  Cashpoints.HASHCODE + " = ?";
    	
    	// Argumenty do warunku selekcji
    	String[] whereArg = new String[] {
    		hashcode
    	};

		Cursor cursor = context.getContentResolver().query(Cashpoints.CONTENT_URI, projection, where, whereArg, Cashpoints.DEFAULT_SORT_ORDER);
		
    	// Pobieram pierwsza wyszukana wartosc
		if (cursor.moveToFirst()) {
	        int idColumn = cursor.getColumnIndex(Cashpoints._ID);
	        idOfCashpoint = cursor.getInt(idColumn);
		} else {
			idOfCashpoint = 0;
		}
        
        // Zamykam kursor
        if (cursor != null) {
        	cursor.close();
        }
		
		// Zwracam identfikator wojewodztwa
		return idOfCashpoint;
	}
	
	/**
	 * Funcja sprawdza czy dany powiat jest powiatem typu " wszystkie "
	 * @param countryId
	 * @return
	 */
	public static boolean isCountryNONE(Context context, int countryId) {
		if (countryId <= 0) {
			return false;
		}
		
		// Buduje adres wybrnego powiatu
        Uri uri = ContentUris.withAppendedId(Countries.CONTENT_URI, countryId);

        // Pobieram powiat
		String[] projection = new String[] { Countries.NAME };
		Cursor cursor = context.getContentResolver().query(uri, projection, null, null, Countries.DEFAULT_SORT_ORDER);
        
		if (cursor.moveToFirst()) {
	        int idColumn = cursor.getColumnIndex(Countries.NAME);
	        String cursorName = cursor.getString(idColumn);
	        
	        if (cursorName != null && PreferencesManager.NONE.equals(cursorName)) {
	        	// Zamykam kursor
	        	cursor.close();
	        	
	        	return true;
	        }
	    }

		// Zamykam kursor
		if (cursor != null) {
			cursor.close();
		}
		
		return false;
	}
}
